#include "app_serial.h"
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include "log.h"
#include"app_device.h"


/**
 * @brief 设置波特率
 */
int app_serial_set_baudrate(int fd, SERIAL_BAUD_RATE baudrate)
{
    // 1 获取当前串口配置
    struct termios  tcattr;
    if (tcgetattr(fd, &tcattr) < 0)
    {
        perror("tcgetattr");
        return -1;
    }

    //2 改参数值
    cfsetspeed(&tcattr, baudrate);

    // 3  设置串口配置
    tcsetattr(fd, TCSAFLUSH, &tcattr);

    return 0;
}


/**
 * @brief 设置停止位
 */
int app_serial_set_stopbit(int fd, SERIAL_STOP_BIT stopbit)
{
     // 1 获取当前串口配置
     struct termios tcattr;
     if (tcgetattr(fd, &tcattr) < 0)
     {
         perror("tcgetattr");
         return -1;
     }
 
     //2 改参数值
     tcattr.c_cflag &= ~CSTOPB;  // 清除停止位
     tcattr.c_cflag |= stopbit; // 设置停止位
 
 
     // 3  设置串口配置
     tcsetattr(fd, TCSAFLUSH, &tcattr);

     return 0;
}


/**
 * @brief 设置校验位
 */
int app_serial_set_parity(int fd, SERIAL_PARITY parity)
{
         // 1 获取当前串口配置
         struct termios tcattr;
         if (tcgetattr(fd, &tcattr) < 0)
         {
             perror("tcgetattr");
             return -1;
         }
     
         //2 改参数值
         tcattr.c_cflag &= ~(PARENB | PARODD); // 清除校验位、
         tcattr.c_cflag |= parity;             // 设置校验位
     
     
     
         // 3  设置串口配置
         tcsetattr(fd, TCSAFLUSH, &tcattr);

         return 0;
}

/**
 * @brief 设置原始模式
 */
int app_serial_set_makeraw(int fd )
{
        // 1 获取当前串口配置
        struct termios tcattr;
        if (tcgetattr(fd, &tcattr) < 0)
        {
            perror("tcgetattr");
            return -1;
        }
    
        //2 改参数值
        cfmakeraw(&tcattr);
    
        // 3  设置串口配置
        tcsetattr(fd, TCSAFLUSH, &tcattr);
        
        return 0;
}

/**
 * @brief 设置是否阻塞
 * @param isblock 是否阻塞 1 阻塞 0 非阻塞
 */
int app_serial_isblock(int fd ,int isblock)
{
    // 1 获取当前串口配置
    struct termios tcattr;
    if (tcgetattr(fd, &tcattr) < 0)
    {
        perror("tcgetattr");
        return -1;
    }

    //2 改参数值
     if (isblock)
     {
         tcattr.c_cc[VTIME] = 0; //无限等待
         tcattr.c_cc[VMIN] = 1;// 只要有一个字符
     }
     else{
        tcattr.c_cc[VTIME] = 2; //100毫秒等待
        tcattr.c_cc[VMIN] = 0;
     }

    // 3  设置串口配置
    tcsetattr(fd, TCSAFLUSH, &tcattr);

    return 0;
}

/**
 * 初始化串口
 */
int app_serial_init(app_device_t *device)
{
    app_serial_set_makeraw(device->dev_fd);
        // 设置波特率
    int ret= app_serial_set_baudrate(device->dev_fd, BR_115200);
    if(ret==-1)
    {
        log_error("串口波特率设置失败  ");
        return -1;
    }
    // 设置无校验位
     app_serial_set_parity(device->dev_fd, PARITY_NONE);
     app_serial_set_stopbit(device->dev_fd, STOP_BIT_ONE);

     app_serial_isblock(device->dev_fd, 1);

     tcflush(device->dev_fd, TCIOFLUSH);
    
     log_info("串口初始化成功  ");
     return 0;
}